package pio.action.administrador.preinscripcion;

import DBMS.DataBaseManager;
import clases.*;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

/**
 *
 * @author charles
 */
public class AsignarPreinscrito extends DispatchAction {

    private final static String SUCCESS = "success";
    private final static String FAILURE = "failure";
    private int preinscritoConAula = 0;
    private int numSartenejas = 0;
    private int numLitoral = 0;

    public ActionForward populate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        ArrayList<Preinscrito> pre = DataBaseManager.getInstance().consultarPreinscritos(new Preinscrito());
        numSartenejas = 0;
        numLitoral = 0;
        preinscritoConAula = 0;
        request.setAttribute("preinscritos", pre);
        request.setAttribute("numPreinscritos", pre.size());
        request.setAttribute("numPreinscritosConAula", calcularConAula(pre, request));
        request.setAttribute("numSartenejas", numSartenejas);
        request.setAttribute("numLitoral", numLitoral);

        return mapping.findForward(SUCCESS);
    }

    public ActionForward make(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        numSartenejas = 0;
        numLitoral = 0;
        preinscritoConAula = 0;
        //todo el codigo del algoritmo a implementar para realizar los calculos pertinentes al test.
        DataBaseManager dbms = DataBaseManager.getInstance();
        ArrayList<Preinscrito> preinscritos = dbms.consultarPreinscritos(new Preinscrito());
        ArrayList<Aula> aulas = dbms.consultarAula(new Aula());
        ArrayList<Turno> turnos = dbms.consultarTurno(new Turno());
        Hashtable aulasPorTurnos = new Hashtable();
        for (Turno t : turnos) {
            aulasPorTurnos.put(t.getId(), clone(aulas));
        }
//        for (Turno t : turnos) {
//            ArrayList<Aula> aulass = (ArrayList<Aula>) aulasPorTurnos.get(t.getId());
//            System.out.println(aulas.get(0).getCapacidad());
//            aulass.get(0).setCapacidad(100000000);
//        }
        for (Preinscrito p : preinscritos) {
            System.out.println(p.getCedula());
            asignarAulaPreinscrito(turnos, aulasPorTurnos, p);
        }
        if (preinscritoConAula < preinscritos.size()) {
            request.setAttribute("error", "Es necesario una mayor cantidad de aulas o turnos para satisfacer la demanda de los aspirantes");
        }
        request.setAttribute("preinscritos", preinscritos);
        request.setAttribute("numPreinscritos", preinscritos.size());
        request.setAttribute("numPreinscritosConAula", calcularConAula(preinscritos, request));
        request.setAttribute("numSartenejas", numSartenejas);
        request.setAttribute("numLitoral", numLitoral);
        return mapping.findForward(SUCCESS);
    }

    private int calcularConAula(ArrayList<Preinscrito> pre, HttpServletRequest request) {
        int k = 0;
        for (Preinscrito p : pre) {
            if (p.getSede() != null) {
                if (p.getSede().equals("SARTENEJAS")) {
                    numSartenejas++;
                } else {
                    numLitoral++;
                }
            } else {
                request.setAttribute("error", "Error: Existen aspirantes sin parada asignada, por favor cargar el archivo de paradas");
            }

            if (p.getAulaPrueba() != null) {
                k++;
            }
        }
        return k;
    }

    private void asignarAulaPreinscrito(ArrayList<Turno> turnos, Hashtable aulasPorTurno, Preinscrito p) {
        for (Turno t : turnos) {
            System.out.println("Turno " + t.getId());
            if (t.getCapacidad() != 0 && t.getSede().equalsIgnoreCase(p.getSede())) {
                ArrayList<Aula> aulas = (ArrayList<Aula>) aulasPorTurno.get(t.getId());
                for (Aula a : aulas) {
                    System.out.println("Aula " + a.getUbicacion());
                    if (a.getCapacidad() != 0 && a.getSede().equalsIgnoreCase(p.getSede())) {
                        p.setAulaPrueba(a.getUbicacion());
                        p.setTurnoPrueba(t.getId());
                        DataBaseManager.getInstance().modificarPreinscrito(p);
                        a.setCapacidad(a.getCapacidad() - 1);
                        this.preinscritoConAula++;
                        break;
                    }
                }
                t.setCapacidad(t.getCapacidad() - 1);
                break;
            }
        }
    }

    private ArrayList<Aula> clone(ArrayList<Aula> aulas) {
        ArrayList <Aula> aa = new ArrayList<Aula>();
        for (Aula a:aulas){
            Aula b = new Aula();
            b.cloneWith(a);
            aa.add(b);
        }
        return aa;
    }
}
